﻿using System;
using System.Globalization;
using Newtonsoft.Json;

namespace IntegratedMeasuring.Utils;

public class CustomDateTimeConverter : JsonConverter<DateTime?>
{
   private static readonly DateTime _emptyMarker = new DateTime(1900, 1, 1); // 你可以选择一个不太可能被实际使用的日期作为标记
    private const string _emptyString = "";
    private static readonly string _dateFormat = "yyyy-MM-dd HH:mm:ss";
 
    public override void WriteJson(JsonWriter writer, DateTime? value, JsonSerializer serializer)
    {
        if (!value.HasValue || value.Value == _emptyMarker)
        {
            writer.WriteValue(_emptyString);
        }
        else
        {
            writer.WriteValue(value.Value.ToString(_dateFormat));
        }
    }
 
    public override DateTime? ReadJson(JsonReader reader, Type objectType, DateTime? existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            return _emptyMarker; // 或者返回 null，但你需要确保你的属性是 DateTime? 类型
        }
 
        string dateString = reader.Value.ToString();
        if (string.IsNullOrWhiteSpace(dateString))
        {
            return _emptyMarker; // 空字符串也被视为“空”日期
        }
 
        if (DateTime.TryParseExact(dateString, _dateFormat, null, DateTimeStyles.None, out DateTime result))
        {
            return result;
        } else if (DateTime.TryParseExact(dateString, "yyyy/M/d HH:mm:ss", null, DateTimeStyles.None, out DateTime result2))
        {
            return result2;
        }
        else if (DateTime.TryParseExact(dateString, "yyyy/MM/dd HH:mm:ss", null, DateTimeStyles.None,
                     out DateTime result3))
        {
            return result3;
        }
        else if (DateTime.TryParseExact(ConvertDateTimeFormatBySplitting(dateString), _dateFormat, null, DateTimeStyles.None, out DateTime result4))
        {
            return result4;
        }
        else
        {
            Console.WriteLine("无法解析日期字符串：" + dateString);
            return null;
        }
 
        //todo
        // 如果格式不匹配，你可以抛出异常或返回默认值（这里选择抛出异常）
        throw new JsonSerializationException($"无法将值 '{dateString}' 解析为 DateTime 类型。");
    }
    
    private static string ConvertDateTimeFormatBySplitting(string input)
    {
        // 首先通过空格将字符串分成日期和时间两部分
        string[] dateTimeParts = input.Split(' ');
        string datePart = dateTimeParts[0];
        string timePart = dateTimeParts[1];
        
        // 然后通过“/”将日期部分拆开成年、月、日
        string[] dateComponents = datePart.Split('/');
        string year = dateComponents[0];
        string month = dateComponents[1].PadLeft(2, '0'); // 确保月份是两位数
        string day = dateComponents[2].PadLeft(2, '0'); // 确保日期是两位数
        
        // 最后通过“:”将时间部分拆开成时、分、秒
        string[] timeComponents = timePart.Split(':');
        string hour = timeComponents[0].PadLeft(2, '0'); // 确保小时是两位数（这里通常是，但为保险起见）
        string minute = timeComponents[1].PadLeft(2, '0'); // 确保分钟是两位数
        string second = timeComponents[2].PadLeft(2, '0'); // 确保秒是两位数
        
        // 拼凑成目标格式的字符串
        string output = $"{year}-{month}-{day} {hour}:{minute}:{second}";
 
        return output;
    } 
}